
class Person{
  String? name;
  int? age;
  double? height;

  //
  // Person([String? name,int? age]){
  //   this.name = name;
  //   this.age = age;
  // }


  // 语法糖写法
  Person({this.name,this.age,this.height});


  /**
   * 命名构造函数
   */
  // dart不支持函数的重载
  // 但是可以自定义构造函数名字
  Person.fromMap(Map<String,dynamic> map){
    this.name = map["name"];
    this.age = map["age"];
  }

  Person.fromJson(){}


  void eating(){
    print("${this.name} eating");
  }

  @override
  String toString() {
    return 'Person{name: $name, age: $age, height: $height}';
  }
}


class Rectangle{
  int? width;
  int? height;
  int? area;
  String? name;


  // 初始化列表
  // 在 ： 后面进行初始化
  // ! 非空断言
  Rectangle(this.width,this.height):area=width!*height!,name="cc";

  @override
  String toString() {
    //



    return "$name rectangle : $area";
  }

  // 一个命名的构造函数 调用 另一个构造函数
  Rectangle.fromName(int width) : this(width,1);


/**
 * 常量构造函数  ： 在创建对象的时候，，，，如果传入的参数是完全一样的，，，那么得到的对象也是完全一样的
 *
 *  构造函数用const修饰
 *  成员变量用final修饰
 *
 *  生成的对象用 const修饰，，不能用 final
 */
// const Rectangle(){}


/**
 * 工厂构造函数 ：
 *      在函数的内部，明确的返回一个对象
 *
 */
// factory Rectangle(){}
}

main(){

  // 从dart 2开始 ，，， new 关键字可以省略
  final p = new Person(name: "waterkid",age: 11);
  // p.name = "cc";
  p.eating();


  Map<String,dynamic> info = {
    "name":"cc",
    "age":11
  };

  final p1 = new Person.fromMap(info);
  p1.eating();

  print(p1);



 final r =  new Rectangle(20, 30);
 final r1 =  new Rectangle(20, 30);
 print(r);

 print(identical(r, r1));
}